package com.naiterui.ehp.bp.utils.lang;

import org.springframework.boot.context.properties.bind.BindResult;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;

import com.naiterui.ehp.bp.support.utils.SysConfigUtil;

/**
 * <pre>
 *      读取配置文件工具类
 *      实现BeanPostProcessor接口是因为一些方法中static方法调用， 这里保证在之前先加载。
 *      读取方式：使用{@link PropertySource}读取，这里获取spring.profiles.active激活的配置，来解决多环境配置，
 *      config.properties：          由于每个项目都使用来做配置环境，所以此文件写死，并且必须读取。
 *      remoterConfig.properties：   此文件是远程调用文件，目前使用http调用，所以需要配置文件。但是此文件不是必须的，所以设置ignoreResourceNotFound = true
 * </pre>
 *
 * @author 王泽浩
 * @date 2018/5/25 上午11:13
 * @since 1.0.0
 */
@SuppressWarnings("unused")
@Component
public class ConfigUtil extends SysConfigUtil {

    /**
     * <pre>
     *     获取配置（字符串）,如果配置文件中没有，那么返回空字符串(保持之前逻辑)
     * </pre>
     *
     * @param key 配置文件key
     *
     * @return key对应结果，如果没有则返回空字符串
     */
    public static String getString(String key) {
        Assert.notNull(environment, "environment 还未初始化！");
        return environment.getProperty(key, String.class, "");
    }

    /**
     * <pre>
     *     获取配置（数字）,如果配置文件中没有，那么返回0 (保持之前逻辑)
     * </pre>
     *
     * @param key 配置文件key
     *
     * @return key对应结果，如果没有则返回0
     */
    public static int getInt(String key) {
        Assert.notNull(environment, "environment 还未初始化！");
        return environment.getProperty(key, Integer.class, 0);
    }

    /**
     * <pre>
     *     根据key前缀，转换为对应Java对象，功能类似 {@link org.springframework.boot.context.properties.ConfigurationProperties}
     * </pre>
     *
     * @param prefix 用于绑定到该对象的属性的名称前缀。
     * @param clazz  需要转换的对象
     * @param <T>    需要转换的对象
     *
     * @return 转换好的对象
     */
    public static <T> T bindProperties(String prefix, Class<T> clazz) {
        Assert.notNull(prefix, "prefix 不能为空");
        Assert.notNull(clazz, "class 不能为空");
        BindResult<T> result = binder.bind(prefix, clazz);
        if (result.isBound()) {
            return result.get();
        } else {
            return null;
        }
    }

}
